Commit 6b06fdba authored by Stephen Neuendorffer's avatar Stephen Neuendorffer Committed by Josh Boyer

[POWERPC] Xilinx: hwicap: Refactor status handling code.

Both the buffer-based and fifo-based icap cores have a status
register.  Previously, this was only used internally to check whether
transactions have completed.  However, the status can be useful to the
main driver as well.  This patch exposes these status functions to the
main driver along with some masks for the differnet bits.
Signed-off-by: default avatarStephen Neuendorffer <stephen.neuendorffer@xilinx.com>
Acked-by: default avatarGrant Likely <grant.likely@secretlab.ca>
Signed-off-by: default avatarJosh Boyer <jwboyer@linux.vnet.ibm.com>
parent 78314263
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
/** /**
* buffer_icap_get_status - Get the contents of the status register. * buffer_icap_get_status - Get the contents of the status register.
* @base_address: is the base address of the device * @drvdata: a pointer to the drvdata.
* *
* The status register contains the ICAP status and the done bit. * The status register contains the ICAP status and the done bit.
* *
...@@ -88,9 +88,9 @@ ...@@ -88,9 +88,9 @@
* D1 - Always 1 * D1 - Always 1
* D0 - Done bit * D0 - Done bit
**/ **/
static inline u32 buffer_icap_get_status(void __iomem *base_address) u32 buffer_icap_get_status(struct hwicap_drvdata *drvdata)
{ {
return in_be32(base_address + XHI_STATUS_REG_OFFSET); return in_be32(drvdata->base_address + XHI_STATUS_REG_OFFSET);
} }
/** /**
...@@ -117,20 +117,8 @@ static inline u32 buffer_icap_get_bram(void __iomem *base_address, ...@@ -117,20 +117,8 @@ static inline u32 buffer_icap_get_bram(void __iomem *base_address,
**/ **/
static inline bool buffer_icap_busy(void __iomem *base_address) static inline bool buffer_icap_busy(void __iomem *base_address)
{ {
return (buffer_icap_get_status(base_address) & 1) == XHI_NOT_FINISHED; u32 status = in_be32(base_address + XHI_STATUS_REG_OFFSET);
} return (status & 1) == XHI_NOT_FINISHED;
/**
* buffer_icap_busy - Return true if the icap device is not busy
* @base_address: is the base address of the device
*
* The queries the low order bit of the status register, which
* indicates whether the current configuration or readback operation
* has completed.
**/
static inline bool buffer_icap_done(void __iomem *base_address)
{
return (buffer_icap_get_status(base_address) & 1) == XHI_FINISHED;
} }
/** /**
......
...@@ -44,8 +44,6 @@ ...@@ -44,8 +44,6 @@
#include <asm/io.h> #include <asm/io.h>
#include "xilinx_hwicap.h" #include "xilinx_hwicap.h"
void buffer_icap_reset(struct hwicap_drvdata *drvdata);
/* Loads a partial bitstream from system memory. */ /* Loads a partial bitstream from system memory. */
int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data, int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data,
u32 Size); u32 Size);
...@@ -54,4 +52,7 @@ int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data, ...@@ -54,4 +52,7 @@ int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data,
int buffer_icap_get_configuration(struct hwicap_drvdata *drvdata, u32 *data, int buffer_icap_get_configuration(struct hwicap_drvdata *drvdata, u32 *data,
u32 Size); u32 Size);
u32 buffer_icap_get_status(struct hwicap_drvdata *drvdata);
void buffer_icap_reset(struct hwicap_drvdata *drvdata);
#endif #endif
...@@ -78,13 +78,6 @@ ...@@ -78,13 +78,6 @@
#define XHI_CR_READ_MASK 0x00000002 /* Read from ICAP to FIFO */ #define XHI_CR_READ_MASK 0x00000002 /* Read from ICAP to FIFO */
#define XHI_CR_WRITE_MASK 0x00000001 /* Write from FIFO to ICAP */ #define XHI_CR_WRITE_MASK 0x00000001 /* Write from FIFO to ICAP */
/* Status Register (SR) */
#define XHI_SR_CFGERR_N_MASK 0x00000100 /* Config Error Mask */
#define XHI_SR_DALIGN_MASK 0x00000080 /* Data Alignment Mask */
#define XHI_SR_RIP_MASK 0x00000040 /* Read back Mask */
#define XHI_SR_IN_ABORT_N_MASK 0x00000020 /* Select Map Abort Mask */
#define XHI_SR_DONE_MASK 0x00000001 /* Done bit Mask */
#define XHI_WFO_MAX_VACANCY 1024 /* Max Write FIFO Vacancy, in words */ #define XHI_WFO_MAX_VACANCY 1024 /* Max Write FIFO Vacancy, in words */
#define XHI_RFO_MAX_OCCUPANCY 256 /* Max Read FIFO Occupancy, in words */ #define XHI_RFO_MAX_OCCUPANCY 256 /* Max Read FIFO Occupancy, in words */
...@@ -151,6 +144,29 @@ static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata) ...@@ -151,6 +144,29 @@ static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata)
dev_dbg(drvdata->dev, "readback started\n"); dev_dbg(drvdata->dev, "readback started\n");
} }
/**
* fifo_icap_get_status - Get the contents of the status register.
* @drvdata: a pointer to the drvdata.
*
* The status register contains the ICAP status and the done bit.
*
* D8 - cfgerr
* D7 - dalign
* D6 - rip
* D5 - in_abort_l
* D4 - Always 1
* D3 - Always 1
* D2 - Always 1
* D1 - Always 1
* D0 - Done bit
**/
u32 fifo_icap_get_status(struct hwicap_drvdata *drvdata)
{
u32 status = in_be32(drvdata->base_address + XHI_SR_OFFSET);
dev_dbg(drvdata->dev, "Getting status = %x\n", status);
return status;
}
/** /**
* fifo_icap_busy - Return true if the ICAP is still processing a transaction. * fifo_icap_busy - Return true if the ICAP is still processing a transaction.
* @drvdata: a pointer to the drvdata. * @drvdata: a pointer to the drvdata.
...@@ -158,7 +174,6 @@ static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata) ...@@ -158,7 +174,6 @@ static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata)
static inline u32 fifo_icap_busy(struct hwicap_drvdata *drvdata) static inline u32 fifo_icap_busy(struct hwicap_drvdata *drvdata)
{ {
u32 status = in_be32(drvdata->base_address + XHI_SR_OFFSET); u32 status = in_be32(drvdata->base_address + XHI_SR_OFFSET);
dev_dbg(drvdata->dev, "Getting status = %x\n", status);
return (status & XHI_SR_DONE_MASK) ? 0 : 1; return (status & XHI_SR_DONE_MASK) ? 0 : 1;
} }
......
...@@ -56,6 +56,7 @@ int fifo_icap_set_configuration( ...@@ -56,6 +56,7 @@ int fifo_icap_set_configuration(
u32 *FrameBuffer, u32 *FrameBuffer,
u32 NumWords); u32 NumWords);
u32 fifo_icap_get_status(struct hwicap_drvdata *drvdata);
void fifo_icap_reset(struct hwicap_drvdata *drvdata); void fifo_icap_reset(struct hwicap_drvdata *drvdata);
void fifo_icap_flush_fifo(struct hwicap_drvdata *drvdata); void fifo_icap_flush_fifo(struct hwicap_drvdata *drvdata);
......
...@@ -664,12 +664,14 @@ static int __devinit hwicap_setup(struct device *dev, int id, ...@@ -664,12 +664,14 @@ static int __devinit hwicap_setup(struct device *dev, int id,
static struct hwicap_driver_config buffer_icap_config = { static struct hwicap_driver_config buffer_icap_config = {
.get_configuration = buffer_icap_get_configuration, .get_configuration = buffer_icap_get_configuration,
.set_configuration = buffer_icap_set_configuration, .set_configuration = buffer_icap_set_configuration,
.get_status = buffer_icap_get_status,
.reset = buffer_icap_reset, .reset = buffer_icap_reset,
}; };
static struct hwicap_driver_config fifo_icap_config = { static struct hwicap_driver_config fifo_icap_config = {
.get_configuration = fifo_icap_get_configuration, .get_configuration = fifo_icap_get_configuration,
.set_configuration = fifo_icap_set_configuration, .set_configuration = fifo_icap_set_configuration,
.get_status = fifo_icap_get_status,
.reset = fifo_icap_reset, .reset = fifo_icap_reset,
}; };
......
...@@ -65,10 +65,27 @@ struct hwicap_drvdata { ...@@ -65,10 +65,27 @@ struct hwicap_drvdata {
}; };
struct hwicap_driver_config { struct hwicap_driver_config {
/* Read configuration data given by size into the data buffer.
Return 0 if successful. */
int (*get_configuration)(struct hwicap_drvdata *drvdata, u32 *data, int (*get_configuration)(struct hwicap_drvdata *drvdata, u32 *data,
u32 size); u32 size);
/* Write configuration data given by size from the data buffer.
Return 0 if successful. */
int (*set_configuration)(struct hwicap_drvdata *drvdata, u32 *data, int (*set_configuration)(struct hwicap_drvdata *drvdata, u32 *data,
u32 size); u32 size);
/* Get the status register, bit pattern given by:
* D8 - 0 = configuration error
* D7 - 1 = alignment found
* D6 - 1 = readback in progress
* D5 - 0 = abort in progress
* D4 - Always 1
* D3 - Always 1
* D2 - Always 1
* D1 - Always 1
* D0 - 1 = operation completed
*/
u32 (*get_status)(struct hwicap_drvdata *drvdata);
/* Reset the hw */
void (*reset)(struct hwicap_drvdata *drvdata); void (*reset)(struct hwicap_drvdata *drvdata);
}; };
...@@ -163,6 +180,13 @@ struct config_registers { ...@@ -163,6 +180,13 @@ struct config_registers {
/* Constant to use for CRC check when CRC has been disabled */ /* Constant to use for CRC check when CRC has been disabled */
#define XHI_DISABLED_AUTO_CRC 0x0000DEFCUL #define XHI_DISABLED_AUTO_CRC 0x0000DEFCUL
/* Meanings of the bits returned by get_status */
#define XHI_SR_CFGERR_N_MASK 0x00000100 /* Config Error Mask */
#define XHI_SR_DALIGN_MASK 0x00000080 /* Data Alignment Mask */
#define XHI_SR_RIP_MASK 0x00000040 /* Read back Mask */
#define XHI_SR_IN_ABORT_N_MASK 0x00000020 /* Select Map Abort Mask */
#define XHI_SR_DONE_MASK 0x00000001 /* Done bit Mask */
/** /**
* hwicap_type_1_read - Generates a Type 1 read packet header. * hwicap_type_1_read - Generates a Type 1 read packet header.
* @reg: is the address of the register to be read back. * @reg: is the address of the register to be read back.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment