aboutsummaryrefslogtreecommitdiff
path: root/linux-core/xgi_cmdlist.c
diff options
context:
space:
mode:
authorIan Romanick <idr@us.ibm.com>2007-07-20 10:57:40 -0700
committerIan Romanick <idr@us.ibm.com>2007-07-20 10:57:40 -0700
commit6bd848307485f678915913f282e2ea59ae3ca1a8 (patch)
tree599091ec37bfd2be36d5af81ac30a5ff9b216d47 /linux-core/xgi_cmdlist.c
parent56665a42f470d5cf8cb4865558cb658dff15a9dd (diff)
Change handling of begin types slightly.
Moved the getCurBatchBeginPort before its only caller. Modified function to return the command ID instead of the port offset. Function also now assumes input begin type is value. Added code to ioctl handler to validate begin type.
Diffstat (limited to 'linux-core/xgi_cmdlist.c')
-rw-r--r--linux-core/xgi_cmdlist.c54
1 files changed, 30 insertions, 24 deletions
diff --git a/linux-core/xgi_cmdlist.c b/linux-core/xgi_cmdlist.c
index 885b5066..6cc4c142 100644
--- a/linux-core/xgi_cmdlist.c
+++ b/linux-core/xgi_cmdlist.c
@@ -34,7 +34,7 @@
struct xgi_cmdring_info s_cmdring;
static void addFlush2D(struct xgi_info * info);
-static unsigned int getCurBatchBeginPort(struct xgi_cmd_info * pCmdInfo);
+static unsigned int get_batch_command(enum xgi_batch_type type);
static void triggerHWCommandList(struct xgi_info * info,
unsigned int triggerCounter);
static void xgi_cmdlist_reset(void);
@@ -61,14 +61,33 @@ int xgi_cmdlist_initialize(struct xgi_info * info, size_t size)
return 0;
}
+
+/**
+ * get_batch_command - Get the command ID for the current begin type.
+ * @type: Type of the current batch
+ *
+ * See section 3.2.2 "Begin" (page 15) of the 3D SPG.
+ *
+ * This function assumes that @type is on the range [0,3].
+ */
+unsigned int get_batch_command(enum xgi_batch_type type)
+{
+ static const unsigned int ports[4] = {
+ 0x30 >> 2, 0x40 >> 2, 0x50 >> 2, 0x20 >> 2
+ };
+
+ return ports[type];
+}
+
+
static void xgi_submit_cmdlist(struct xgi_info * info,
- struct xgi_cmd_info * pCmdInfo)
+ const struct xgi_cmd_info * pCmdInfo)
{
- const unsigned int beginPort = getCurBatchBeginPort(pCmdInfo);
+ const unsigned int cmd = get_batch_command(pCmdInfo->_firstBeginType);
if (s_cmdring._lastBatchStartAddr == 0) {
- const unsigned int portOffset = BASE_3D_ENG + beginPort;
+ const unsigned int portOffset = BASE_3D_ENG + (cmd << 2);
/* Enable PCI Trigger Mode
@@ -90,10 +109,10 @@ static void xgi_submit_cmdlist(struct xgi_info * info,
/* Send PCI begin command
*/
DRM_INFO("portOffset=%d, beginPort=%d\n",
- portOffset, beginPort);
+ portOffset, cmd << 2);
dwWriteReg(info->mmio_map, portOffset,
- (beginPort << 22) + (BEGIN_VALID_MASK) +
+ (cmd << 24) + (BEGIN_VALID_MASK) +
pCmdInfo->_curDebugID);
dwWriteReg(info->mmio_map, portOffset + 4,
@@ -128,7 +147,7 @@ static void xgi_submit_cmdlist(struct xgi_info * info,
lastBatchVirtAddr[3] = 0;
//barrier();
lastBatchVirtAddr[0] =
- (beginPort << 22) + (BEGIN_VALID_MASK) +
+ (cmd << 24) + (BEGIN_VALID_MASK) +
(0xffff & pCmdInfo->_curDebugID);
/* Jong 06/12/2006; system hang; marked for test */
@@ -153,6 +172,10 @@ int xgi_submit_cmdlist_ioctl(DRM_IOCTL_ARGS)
(struct xgi_cmd_info __user *) data,
sizeof(cmd_list));
+ if (cmd_list._firstBeginType > BTYPE_CTRL) {
+ return DRM_ERR(EINVAL);
+ }
+
xgi_submit_cmdlist(info, &cmd_list);
return 0;
}
@@ -238,23 +261,6 @@ static void triggerHWCommandList(struct xgi_info * info,
}
}
-static unsigned int getCurBatchBeginPort(struct xgi_cmd_info * pCmdInfo)
-{
- // Convert the batch type to begin port ID
- switch (pCmdInfo->_firstBeginType) {
- case BTYPE_2D:
- return 0x30;
- case BTYPE_3D:
- return 0x40;
- case BTYPE_FLIP:
- return 0x50;
- case BTYPE_CTRL:
- return 0x20;
- default:
- //ASSERT(0);
- return 0xff;
- }
-}
static void addFlush2D(struct xgi_info * info)
{