[U-Boot] [PATCH] ahci: fix compile warning under 64 bit mode

shh.xie at gmail.com shh.xie at gmail.com
Mon Jan 26 07:37:45 CET 2015


From: Shaohui Xie <Shaohui.Xie at freescale.com>

When compiling under 64 bit mode, there are warnings as below:

In file included from drivers/block/ahci.c:16:0:
drivers/block/ahci.c: In function 'ahci_reset':
./arch/arm/include/asm/io.h:72:28: warning: cast to pointer from integer
of different size [-Wint-to-pointer-cast]
 #define __arch_getl(a)   (*(volatile unsigned int *)(a))
                            ^
./arch/arm/include/asm/io.h:151:31: note: in expansion of macro
'__arch_getl'
 #define readl(c) ({ u32 __v = __arch_getl(c); __iormb(); __v; })
                               ^
drivers/block/ahci.c:144:12: note: in expansion of macro 'readl'
  u32 tmp = readl(host_ctl_reg); /* global controller reset */
            ^
./arch/arm/include/asm/io.h:77:29: warning: cast to pointer from integer
of different size [-Wint-to-pointer-cast]
 #define __arch_putl(v,a)  (*(volatile unsigned int *)(a) = (v))
                             ^
./arch/arm/include/asm/io.h:146:48: note: in expansion of macro
'__arch_putl'
 #define writel(v,c) ({ u32 __v = v; __iowmb(); __arch_putl(__v,c); __v;
})
                                                ^
drivers/block/ahci.c:28:37: note: in expansion of macro 'writel'
 #define writel_with_flush(a,b) do { writel(a,b); readl(b); } while (0)
                                     ^
drivers/block/ahci.c:147:3: note: in expansion of macro
'writel_with_flush'
   writel_with_flush(tmp | HOST_RESET, host_ctl_reg);
   ^
./arch/arm/include/asm/io.h:72:28: warning: cast to pointer from integer
of different size [-Wint-to-pointer-cast]
 #define __arch_getl(a)   (*(volatile unsigned int *)(a))
                            ^
./arch/arm/include/asm/io.h:151:31: note: in expansion of macro
'__arch_getl'
 #define readl(c) ({ u32 __v = __arch_getl(c); __iormb(); __v; })
                               ^
drivers/block/ahci.c:28:50: note: in expansion of macro 'readl'
 #define writel_with_flush(a,b) do { writel(a,b); readl(b); } while (0)
                                                  ^
drivers/block/ahci.c:147:3: note: in expansion of macro
'writel_with_flush'
   writel_with_flush(tmp | HOST_RESET, host_ctl_reg);
   ^
./arch/arm/include/asm/io.h:72:28: warning: cast to pointer from integer
of different size [-Wint-to-pointer-cast]
 #define __arch_getl(a)   (*(volatile unsigned int *)(a))
                            ^
./arch/arm/include/asm/io.h:151:31: note: in expansion of macro
'__arch_getl'
 #define readl(c) ({ u32 __v = __arch_getl(c); __iormb(); __v; })
                               ^
drivers/block/ahci.c:155:9: note: in expansion of macro 'readl'
   tmp = readl(host_ctl_reg);
         ^
drivers/block/ahci.c: In function 'ahci_host_init':
drivers/block/ahci.c:174:22: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  volatile u8 *mmio = (volatile u8 *)probe_ent->mmio_base;
                      ^
drivers/block/ahci.c:218:49: warning: cast from pointer to integer of
different size [-Wpointer-to-int-cast]
   probe_ent->port[i].port_mmio = ahci_port_base((u32) mmio, i);
                                                 ^
drivers/block/ahci.c:219:15: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
   port_mmio = (u8 *) probe_ent->port[i].port_mmio;
               ^
drivers/block/ahci.c: In function 'ahci_print_info':
drivers/block/ahci.c:332:22: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  volatile u8 *mmio = (volatile u8 *)probe_ent->mmio_base;
                      ^
In file included from ./arch/arm/include/asm/byteorder.h:29:0,
                 from include/compiler.h:125,
                 from include/image.h:19,
                 from include/common.h:82,
                 from drivers/block/ahci.c:10:
drivers/block/ahci.c: In function 'ahci_fill_sg':
drivers/block/ahci.c:464:19: warning: cast from pointer to integer of
different size [-Wpointer-to-int-cast]
       cpu_to_le32((u32) buf + i * MAX_DATA_BYTE_COUNT);
                   ^
include/linux/byteorder/little_endian.h:34:51: note: in definition of
macro '__cpu_to_le32'
 #define __cpu_to_le32(x) ((__force __le32)(__u32)(x))
                                                   ^
drivers/block/ahci.c:464:7: note: in expansion of macro 'cpu_to_le32'
       cpu_to_le32((u32) buf + i * MAX_DATA_BYTE_COUNT);
       ^
drivers/block/ahci.c: In function 'ahci_port_start':
drivers/block/ahci.c:520:27: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  volatile u8 *port_mmio = (volatile u8 *)pp->port_mmio;
                           ^
drivers/block/ahci.c:532:8: warning: cast from pointer to integer of
different size [-Wpointer-to-int-cast]
  mem = (u32) malloc(AHCI_PORT_PRIV_DMA_SZ + 2048);
        ^
drivers/block/ahci.c:540:9: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  memset((u8 *) mem, 0, AHCI_PORT_PRIV_DMA_SZ);
         ^
drivers/block/ahci.c:547:50: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
   (struct ahci_cmd_hdr *)(uintptr_t)virt_to_phys((void *)mem);
                                                  ^
In file included from drivers/block/ahci.c:10:0:
drivers/block/ahci.c:548:29: warning: cast from pointer to integer of
different size [-Wpointer-to-int-cast]
  debug("cmd_slot = 0x%x\n", (unsigned)pp->cmd_slot);
                             ^
include/common.h:109:26: note: in definition of macro 'debug_cond'
    printf(pr_fmt(fmt), ##args); \
                          ^
drivers/block/ahci.c:548:2: note: in expansion of macro 'debug'
  debug("cmd_slot = 0x%x\n", (unsigned)pp->cmd_slot);
  ^
drivers/block/ahci.c:554:28: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  pp->rx_fis = virt_to_phys((void *)mem);
                            ^
drivers/block/ahci.c:561:29: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  pp->cmd_tbl = virt_to_phys((void *)mem);
                             ^
drivers/block/ahci.c:566:46: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
    (struct ahci_sg *)(uintptr_t)virt_to_phys((void *)mem);
                                              ^
In file included from drivers/block/ahci.c:16:0:
drivers/block/ahci.c:568:20: warning: cast from pointer to integer of
different size [-Wpointer-to-int-cast]
  writel_with_flush((u32) pp->cmd_slot, port_mmio + PORT_LST_ADDR);
                    ^
./arch/arm/include/asm/io.h:146:34: note: in definition of macro
'writel'
 #define writel(v,c) ({ u32 __v = v; __iowmb(); __arch_putl(__v,c); __v;
})
                                  ^
drivers/block/ahci.c:568:2: note: in expansion of macro
'writel_with_flush'
  writel_with_flush((u32) pp->cmd_slot, port_mmio + PORT_LST_ADDR);
  ^
drivers/block/ahci.c: In function 'ahci_device_data_io':
drivers/block/ahci.c:591:27: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  volatile u8 *port_mmio = (volatile u8 *)pp->port_mmio;
                           ^
drivers/block/ahci.c:609:9: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  memcpy((unsigned char *)pp->cmd_tbl, fis, fis_len);
         ^
drivers/block/ahci.c:616:26: warning: cast from pointer to integer of
different size [-Wpointer-to-int-cast]
  ahci_dcache_flush_range((unsigned)buf, (unsigned)buf_len);
                          ^
drivers/block/ahci.c:626:31: warning: cast from pointer to integer of
different size [-Wpointer-to-int-cast]
  ahci_dcache_invalidate_range((unsigned)buf, (unsigned)buf_len);
                               ^
drivers/block/ahci.c: In function 'ata_io_flush':
drivers/block/ahci.c:990:27: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  volatile u8 *port_mmio = (volatile u8 *)pp->port_mmio;
                           ^
drivers/block/ahci.c:999:9: warning: cast to pointer from integer of
different size [-Wint-to-pointer-cast]
  memcpy((unsigned char *)pp->cmd_tbl, fis, 20);
         ^

Signed-off-by: Shaohui Xie <Shaohui.Xie at freescale.com>
---
 drivers/block/ahci.c | 57 ++++++++++++++++++++++++++++------------------------
 1 file changed, 31 insertions(+), 26 deletions(-)

diff --git a/drivers/block/ahci.c b/drivers/block/ahci.c
index 37d2d2a..5e85895 100644
--- a/drivers/block/ahci.c
+++ b/drivers/block/ahci.c
@@ -94,7 +94,7 @@ static void ahci_dcache_flush_sata_cmd(struct ahci_ioports *pp)
 				AHCI_PORT_PRIV_DMA_SZ);
 }
 
-static int waiting_for_cmd_completed(volatile u8 *offset,
+static int waiting_for_cmd_completed(u8 *offset,
 				     int timeout_msec,
 				     u32 sign)
 {
@@ -111,7 +111,7 @@ int __weak ahci_link_up(struct ahci_probe_ent *probe_ent, u8 port)
 {
 	u32 tmp;
 	int j = 0;
-	u8 *port_mmio = (u8 *)probe_ent->port[port].port_mmio;
+	u8 *port_mmio = (u8 *)(unsigned long)probe_ent->port[port].port_mmio;
 
 	/*
 	 * Bring up SATA link.
@@ -131,7 +131,7 @@ int __weak ahci_link_up(struct ahci_probe_ent *probe_ent, u8 port)
 
 #ifdef CONFIG_SUNXI_AHCI
 /* The sunxi AHCI controller requires this undocumented setup */
-static void sunxi_dma_init(volatile u8 *port_mmio)
+static void sunxi_dma_init(u8 *port_mmio)
 {
 	clrsetbits_le32(port_mmio + PORT_P0DMACR, 0x0000ff00, 0x00004400);
 }
@@ -140,7 +140,7 @@ static void sunxi_dma_init(volatile u8 *port_mmio)
 int ahci_reset(u32 base)
 {
 	int i = 1000;
-	u32 host_ctl_reg = base + HOST_CTL;
+	u32 *host_ctl_reg = (u32 *)(unsigned long)(base + HOST_CTL);
 	u32 tmp = readl(host_ctl_reg); /* global controller reset */
 
 	if ((tmp & HOST_RESET) == 0)
@@ -171,10 +171,10 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
 	u16 tmp16;
 	unsigned short vendor;
 #endif
-	volatile u8 *mmio = (volatile u8 *)probe_ent->mmio_base;
+	u8 *mmio = (u8 *)(unsigned long)probe_ent->mmio_base;
 	u32 tmp, cap_save, cmd;
 	int i, j, ret;
-	volatile u8 *port_mmio;
+	u8 *port_mmio;
 	u32 port_map;
 
 	debug("ahci_host_init: start\n");
@@ -215,8 +215,9 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
 	for (i = 0; i < probe_ent->n_ports; i++) {
 		if (!(port_map & (1 << i)))
 			continue;
-		probe_ent->port[i].port_mmio = ahci_port_base((u32) mmio, i);
-		port_mmio = (u8 *) probe_ent->port[i].port_mmio;
+		probe_ent->port[i].port_mmio =
+			ahci_port_base((unsigned long)mmio, i);
+		port_mmio = (u8 *)(unsigned long)probe_ent->port[i].port_mmio;
 		ahci_setup_port(&probe_ent->port[i], (unsigned long)mmio, i);
 
 		/* make sure port is not active */
@@ -329,7 +330,7 @@ static void ahci_print_info(struct ahci_probe_ent *probe_ent)
 	pci_dev_t pdev = probe_ent->dev;
 	u16 cc;
 #endif
-	volatile u8 *mmio = (volatile u8 *)probe_ent->mmio_base;
+	u8 *mmio = (u8 *)(unsigned long)probe_ent->mmio_base;
 	u32 vers, cap, cap2, impl, speed;
 	const char *speed_s;
 	const char *scc_s;
@@ -461,7 +462,7 @@ static int ahci_fill_sg(u8 port, unsigned char *buf, int buf_len)
 
 	for (i = 0; i < sg_count; i++) {
 		ahci_sg->addr =
-		    cpu_to_le32((u32) buf + i * MAX_DATA_BYTE_COUNT);
+		    cpu_to_le32((unsigned long) buf + i * MAX_DATA_BYTE_COUNT);
 		ahci_sg->addr_hi = 0;
 		ahci_sg->flags_size = cpu_to_le32(0x3fffff &
 					  (buf_len < MAX_DATA_BYTE_COUNT
@@ -488,7 +489,7 @@ static void ahci_fill_cmd_slot(struct ahci_ioports *pp, u32 opts)
 static void ahci_set_feature(u8 port)
 {
 	struct ahci_ioports *pp = &(probe_ent->port[port]);
-	volatile u8 *port_mmio = (volatile u8 *)pp->port_mmio;
+	u8 *port_mmio = (u8 *)pp->port_mmio;
 	u32 cmd_fis_len = 5;	/* five dwords */
 	u8 fis[20];
 
@@ -517,7 +518,7 @@ static void ahci_set_feature(u8 port)
 static int ahci_port_start(u8 port)
 {
 	struct ahci_ioports *pp = &(probe_ent->port[port]);
-	volatile u8 *port_mmio = (volatile u8 *)pp->port_mmio;
+	u8 *port_mmio = (u8 *)(unsigned long)pp->port_mmio;
 	u32 port_status;
 	u32 mem;
 
@@ -529,7 +530,7 @@ static int ahci_port_start(u8 port)
 		return -1;
 	}
 
-	mem = (u32) malloc(AHCI_PORT_PRIV_DMA_SZ + 2048);
+	mem = (unsigned long) malloc(AHCI_PORT_PRIV_DMA_SZ + 2048);
 	if (!mem) {
 		free(pp);
 		printf("%s: No mem for table!\n", __func__);
@@ -537,35 +538,38 @@ static int ahci_port_start(u8 port)
 	}
 
 	mem = (mem + 0x800) & (~0x7ff);	/* Aligned to 2048-bytes */
-	memset((u8 *) mem, 0, AHCI_PORT_PRIV_DMA_SZ);
+	memset((u8 *)(unsigned long)mem, 0, AHCI_PORT_PRIV_DMA_SZ);
 
 	/*
 	 * First item in chunk of DMA memory: 32-slot command table,
 	 * 32 bytes each in size
 	 */
 	pp->cmd_slot =
-		(struct ahci_cmd_hdr *)(uintptr_t)virt_to_phys((void *)mem);
-	debug("cmd_slot = 0x%x\n", (unsigned)pp->cmd_slot);
+		(struct ahci_cmd_hdr *)
+		(uintptr_t)virt_to_phys((void *)(unsigned long)mem);
+	debug("cmd_slot = 0x%x\n", (unsigned int)(unsigned long)pp->cmd_slot);
 	mem += (AHCI_CMD_SLOT_SZ + 224);
 
 	/*
 	 * Second item: Received-FIS area
 	 */
-	pp->rx_fis = virt_to_phys((void *)mem);
+	pp->rx_fis = virt_to_phys((void *)(unsigned long)mem);
 	mem += AHCI_RX_FIS_SZ;
 
 	/*
 	 * Third item: data area for storing a single command
 	 * and its scatter-gather table
 	 */
-	pp->cmd_tbl = virt_to_phys((void *)mem);
+	pp->cmd_tbl = virt_to_phys((void *)(unsigned long)mem);
 	debug("cmd_tbl_dma = 0x%x\n", pp->cmd_tbl);
 
 	mem += AHCI_CMD_TBL_HDR;
 	pp->cmd_tbl_sg =
-			(struct ahci_sg *)(uintptr_t)virt_to_phys((void *)mem);
+			(struct ahci_sg *)
+			(uintptr_t)virt_to_phys((void *)(unsigned long)mem);
 
-	writel_with_flush((u32) pp->cmd_slot, port_mmio + PORT_LST_ADDR);
+	writel_with_flush((unsigned long)pp->cmd_slot,
+			  port_mmio + PORT_LST_ADDR);
 
 	writel_with_flush(pp->rx_fis, port_mmio + PORT_FIS_ADDR);
 
@@ -588,7 +592,7 @@ static int ahci_device_data_io(u8 port, u8 *fis, int fis_len, u8 *buf,
 {
 
 	struct ahci_ioports *pp = &(probe_ent->port[port]);
-	volatile u8 *port_mmio = (volatile u8 *)pp->port_mmio;
+	u8 *port_mmio = (u8 *)(unsigned long)pp->port_mmio;
 	u32 opts;
 	u32 port_status;
 	int sg_count;
@@ -606,14 +610,14 @@ static int ahci_device_data_io(u8 port, u8 *fis, int fis_len, u8 *buf,
 		return -1;
 	}
 
-	memcpy((unsigned char *)pp->cmd_tbl, fis, fis_len);
+	memcpy((unsigned char *)(unsigned long)pp->cmd_tbl, fis, fis_len);
 
 	sg_count = ahci_fill_sg(port, buf, buf_len);
 	opts = (fis_len >> 2) | (sg_count << 16) | (is_write << 6);
 	ahci_fill_cmd_slot(pp, opts);
 
 	ahci_dcache_flush_sata_cmd(pp);
-	ahci_dcache_flush_range((unsigned)buf, (unsigned)buf_len);
+	ahci_dcache_flush_range((unsigned long)buf, (unsigned long)buf_len);
 
 	writel_with_flush(1, port_mmio + PORT_CMD_ISSUE);
 
@@ -623,7 +627,8 @@ static int ahci_device_data_io(u8 port, u8 *fis, int fis_len, u8 *buf,
 		return -1;
 	}
 
-	ahci_dcache_invalidate_range((unsigned)buf, (unsigned)buf_len);
+	ahci_dcache_invalidate_range((unsigned long)buf,
+				     (unsigned long)buf_len);
 	debug("%s: %d byte transferred.\n", __func__, pp->cmd_slot->status);
 
 	return 0;
@@ -987,7 +992,7 @@ static int ata_io_flush(u8 port)
 {
 	u8 fis[20];
 	struct ahci_ioports *pp = &(probe_ent->port[port]);
-	volatile u8 *port_mmio = (volatile u8 *)pp->port_mmio;
+	u8 *port_mmio = (u8 *)(unsigned long)pp->port_mmio;
 	u32 cmd_fis_len = 5;	/* five dwords */
 
 	/* Preset the FIS */
@@ -996,7 +1001,7 @@ static int ata_io_flush(u8 port)
 	fis[1] = 1 << 7;	 /* Command FIS. */
 	fis[2] = ATA_CMD_FLUSH_EXT;
 
-	memcpy((unsigned char *)pp->cmd_tbl, fis, 20);
+	memcpy((unsigned char *)(unsigned long)pp->cmd_tbl, fis, 20);
 	ahci_fill_cmd_slot(pp, cmd_fis_len);
 	writel_with_flush(1, port_mmio + PORT_CMD_ISSUE);
 
-- 
2.1.0.27.g96db324



More information about the U-Boot mailing list