0xFF                    /* F - ATTRIB_RAW_PROCESS_BYTES */
 };
 
+#define PCC_MASTER_SUBSPACE    3
+
+/*
+ * The following macros determine a given offset is a COMD field.
+ * According to the specification, generic subspaces (types 0-2) contains a
+ * 2-byte COMD field at offset 4 and master subspaces (type 3) contains a 4-byte
+ * COMD field starting at offset 12.
+ */
+#define GENERIC_SUBSPACE_COMMAND(a)    (4 == a || a == 5)
+#define MASTER_SUBSPACE_COMMAND(a)     (12 <= a && a <= 15)
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ex_get_protocol_buffer_length
 
                status = acpi_ex_read_gpio(obj_desc, buffer);
                goto exit;
+       } else if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
+                  (obj_desc->field.region_obj->region.space_id ==
+                   ACPI_ADR_SPACE_PLATFORM_COMM)) {
+               /*
+                * Reading from a PCC field unit does not require the handler because
+                * it only requires reading from the internal_pcc_buffer.
+                */
+               ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
+                                 "PCC FieldRead bits %u\n",
+                                 obj_desc->field.bit_length));
+
+               memcpy(buffer,
+                      obj_desc->field.region_obj->field.internal_pcc_buffer +
+                      obj_desc->field.base_byte_offset,
+                      (acpi_size)ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->field.
+                                                             bit_length));
+
+               *ret_buffer_desc = buffer_desc;
+               return AE_OK;
        }
 
        ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
 {
        acpi_status status;
        u32 buffer_length;
+       u32 data_length;
        void *buffer;
 
        ACPI_FUNCTION_TRACE_PTR(ex_write_data_to_field, obj_desc);
                    acpi_ex_write_serial_bus(source_desc, obj_desc,
                                             result_desc);
                return_ACPI_STATUS(status);
+       } else if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
+                  (obj_desc->field.region_obj->region.space_id ==
+                   ACPI_ADR_SPACE_PLATFORM_COMM)) {
+               /*
+                * According to the spec a write to the COMD field will invoke the
+                * region handler. Otherwise, write to the pcc_internal buffer. This
+                * implementation will use the offsets specified rather than the name
+                * of the field. This is considered safer because some firmware tools
+                * are known to obfiscate named objects.
+                */
+               data_length =
+                   (acpi_size)ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->field.
+                                                          bit_length);
+               memcpy(obj_desc->field.region_obj->field.internal_pcc_buffer +
+                      obj_desc->field.base_byte_offset,
+                      source_desc->buffer.pointer, data_length);
+               if ((obj_desc->field.region_obj->region.address ==
+                    PCC_MASTER_SUBSPACE
+                    && MASTER_SUBSPACE_COMMAND(obj_desc->field.
+                                               base_byte_offset))
+                   || GENERIC_SUBSPACE_COMMAND(obj_desc->field.
+                                               base_byte_offset)) {
+
+                       /* Perform the write */
+
+                       ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
+                                         "PCC COMD field has been written. Invoking PCC handler now.\n"));
+
+                       status =
+                           acpi_ex_access_region(obj_desc, 0,
+                                                 (u64 *)obj_desc->field.
+                                                 region_obj->field.
+                                                 internal_pcc_buffer,
+                                                 ACPI_WRITE);
+                       return_ACPI_STATUS(status);
+               }
+               return (AE_OK);
        }
 
        /* Get a pointer to the data to be written */