Skip to content

Commit

Permalink
intel_pmc_ipc: update acpi resource structure for Punit
Browse files Browse the repository at this point in the history
BIOS restructure exported memory resources for Punit
in acpi table, So update resources for Punit.

Signed-off-by: Qipeng Zha <qipeng.zha@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Darren Hart <dvhart@linux.intel.com>
  • Loading branch information
Qipeng Zha authored and Darren Hart committed Jan 19, 2016
1 parent edde316 commit 8cc7fb4
Showing 1 changed file with 78 additions and 40 deletions.
118 changes: 78 additions & 40 deletions drivers/platform/x86/intel_pmc_ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,12 @@
#define PLAT_RESOURCE_IPC_INDEX 0
#define PLAT_RESOURCE_IPC_SIZE 0x1000
#define PLAT_RESOURCE_GCR_SIZE 0x1000
#define PLAT_RESOURCE_PUNIT_DATA_INDEX 1
#define PLAT_RESOURCE_PUNIT_INTER_INDEX 2
#define PLAT_RESOURCE_BIOS_DATA_INDEX 1
#define PLAT_RESOURCE_BIOS_IFACE_INDEX 2
#define PLAT_RESOURCE_ISP_DATA_INDEX 4
#define PLAT_RESOURCE_ISP_IFACE_INDEX 5
#define PLAT_RESOURCE_GTD_DATA_INDEX 6
#define PLAT_RESOURCE_GTD_IFACE_INDEX 7
#define PLAT_RESOURCE_ACPI_IO_INDEX 0

/*
Expand Down Expand Up @@ -105,10 +109,6 @@ static struct intel_pmc_ipc_dev {
int gcr_size;

/* punit */
resource_size_t punit_base;
int punit_size;
resource_size_t punit_base2;
int punit_size2;
struct platform_device *punit_dev;
} ipcdev;

Expand Down Expand Up @@ -444,9 +444,22 @@ static const struct attribute_group intel_ipc_group = {
.attrs = intel_ipc_attrs,
};

#define PUNIT_RESOURCE_INTER 1
static struct resource punit_res[] = {
/* Punit */
static struct resource punit_res_array[] = {
/* Punit BIOS */
{
.flags = IORESOURCE_MEM,
},
{
.flags = IORESOURCE_MEM,
},
/* Punit ISP */
{
.flags = IORESOURCE_MEM,
},
{
.flags = IORESOURCE_MEM,
},
/* Punit GTD */
{
.flags = IORESOURCE_MEM,
},
Expand Down Expand Up @@ -481,7 +494,6 @@ static struct itco_wdt_platform_data tco_info = {
static int ipc_create_punit_device(void)
{
struct platform_device *pdev;
struct resource *res;
int ret;

pdev = platform_device_alloc(PUNIT_DEVICE_NAME, -1);
Expand All @@ -491,17 +503,8 @@ static int ipc_create_punit_device(void)
}

pdev->dev.parent = ipcdev.dev;

res = punit_res;
res->start = ipcdev.punit_base;
res->end = res->start + ipcdev.punit_size - 1;

res = punit_res + PUNIT_RESOURCE_INTER;
res->start = ipcdev.punit_base2;
res->end = res->start + ipcdev.punit_size2 - 1;

ret = platform_device_add_resources(pdev, punit_res,
ARRAY_SIZE(punit_res));
ret = platform_device_add_resources(pdev, punit_res_array,
ARRAY_SIZE(punit_res_array));
if (ret) {
dev_err(ipcdev.dev, "Failed to add platform punit resources\n");
goto err;
Expand Down Expand Up @@ -590,7 +593,7 @@ static int ipc_create_pmc_devices(void)

static int ipc_plat_get_res(struct platform_device *pdev)
{
struct resource *res;
struct resource *res, *punit_res;
void __iomem *addr;
int size;

Expand All @@ -603,32 +606,68 @@ static int ipc_plat_get_res(struct platform_device *pdev)
size = resource_size(res);
ipcdev.acpi_io_base = res->start;
ipcdev.acpi_io_size = size;
dev_info(&pdev->dev, "io res: %llx %x\n",
(long long)res->start, (int)resource_size(res));
dev_info(&pdev->dev, "io res: %pR\n", res);

/* This is index 0 to cover BIOS data register */
punit_res = punit_res_array;
res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_PUNIT_DATA_INDEX);
PLAT_RESOURCE_BIOS_DATA_INDEX);
if (!res) {
dev_err(&pdev->dev, "Failed to get punit resource\n");
dev_err(&pdev->dev, "Failed to get res of punit BIOS data\n");
return -ENXIO;
}
size = resource_size(res);
ipcdev.punit_base = res->start;
ipcdev.punit_size = size;
dev_info(&pdev->dev, "punit data res: %llx %x\n",
(long long)res->start, (int)resource_size(res));
*punit_res = *res;
dev_info(&pdev->dev, "punit BIOS data res: %pR\n", res);

res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_PUNIT_INTER_INDEX);
PLAT_RESOURCE_BIOS_IFACE_INDEX);
if (!res) {
dev_err(&pdev->dev, "Failed to get punit inter resource\n");
dev_err(&pdev->dev, "Failed to get res of punit BIOS iface\n");
return -ENXIO;
}
size = resource_size(res);
ipcdev.punit_base2 = res->start;
ipcdev.punit_size2 = size;
dev_info(&pdev->dev, "punit interface res: %llx %x\n",
(long long)res->start, (int)resource_size(res));
/* This is index 1 to cover BIOS interface register */
*++punit_res = *res;
dev_info(&pdev->dev, "punit BIOS interface res: %pR\n", res);

res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_ISP_DATA_INDEX);
if (!res) {
dev_err(&pdev->dev, "Failed to get res of punit ISP data\n");
return -ENXIO;
}
/* This is index 2 to cover ISP data register */
*++punit_res = *res;
dev_info(&pdev->dev, "punit ISP data res: %pR\n", res);

res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_ISP_IFACE_INDEX);
if (!res) {
dev_err(&pdev->dev, "Failed to get res of punit ISP iface\n");
return -ENXIO;
}
/* This is index 3 to cover ISP interface register */
*++punit_res = *res;
dev_info(&pdev->dev, "punit ISP interface res: %pR\n", res);

res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_GTD_DATA_INDEX);
if (!res) {
dev_err(&pdev->dev, "Failed to get res of punit GTD data\n");
return -ENXIO;
}
/* This is index 4 to cover GTD data register */
*++punit_res = *res;
dev_info(&pdev->dev, "punit GTD data res: %pR\n", res);

res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_GTD_IFACE_INDEX);
if (!res) {
dev_err(&pdev->dev, "Failed to get res of punit GTD iface\n");
return -ENXIO;
}
/* This is index 5 to cover GTD interface register */
*++punit_res = *res;
dev_info(&pdev->dev, "punit GTD interface res: %pR\n", res);

res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_IPC_INDEX);
Expand All @@ -651,8 +690,7 @@ static int ipc_plat_get_res(struct platform_device *pdev)

ipcdev.gcr_base = res->start + size;
ipcdev.gcr_size = PLAT_RESOURCE_GCR_SIZE;
dev_info(&pdev->dev, "ipc res: %llx %x\n",
(long long)res->start, (int)resource_size(res));
dev_info(&pdev->dev, "ipc res: %pR\n", res);

return 0;
}
Expand Down

0 comments on commit 8cc7fb4

Please sign in to comment.